home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’95 / Search Example / Main.c < prev    next >
C/C++ Source or Header  |  1994-03-23  |  8KB  |  483 lines

  1. /*Main.c*/
  2. /*
  3.   This is a simple skeleton application that opens a window, handles the menu bar,
  4.   and dispatches events. See MenuItem for menu dispatches, CkEvents for the event
  5.   loop. Not much of interest here....
  6.   
  7.   All the good stuff is in AEVT.c
  8.   
  9.  */
  10.  
  11. #include <stdio.h>
  12. #include <string.h>
  13. #include <GestaltEqu.h>
  14. #include <AppleEvents.h>
  15.  
  16. #include <Types.h>
  17. #include <Memory.h>
  18. #include <Windows.h>
  19. #include <Dialogs.h>
  20. #include <Menus.h>
  21. #include <Fonts.h>
  22. #include <Events.h>
  23. #include <OSEvents.h>
  24. #include <Desk.h>
  25. #include <ToolUtils.h>
  26.  
  27. #include "main.h"
  28. #include "AEVT.h"
  29. #include "TTY_Messages.h"
  30.  
  31. #define THEWINID 128
  32. #define DBGWINID 129
  33.  
  34. #define ERRALRT 129
  35. #define CREATORID 129
  36.  
  37. #define KEYMASK 0xff
  38. #define MENUCOUNT 3
  39.  
  40. #define DeskResID  128
  41. #define FileResID  129
  42. #define EditResID  130
  43. #define OptionResID 131
  44. #define Desk_ID 0
  45. #define File_ID 1
  46. #define Edit_ID 2
  47. #define Option_ID 3
  48.  
  49. /*** Globals ***/
  50.  
  51. long gOSVersion;
  52.  
  53. /*** Local to Template.c ***/
  54.  
  55. static WindowPtr theWin,curWin,dbgWin;
  56. static WindowPtr whichWindow;
  57. static short windowCode, stillGoAway;
  58. static MenuHandle menuList[MENUCOUNT];    
  59. static EventRecord theEvent;
  60.  
  61. static int runningMulti;
  62. static int inForeground;
  63.  
  64.  
  65. static FILE *f;
  66.  
  67. int theWinOpen,done;
  68. static int waitct;
  69.  
  70. static OSType ftype;
  71.  
  72. static char s[80];
  73.  
  74. /***************************/
  75.  
  76. Click()
  77. {
  78.     while (!Button());
  79.     while (Button());
  80. }
  81.  
  82. /***************************/
  83.  
  84. Error(msg)
  85. char *msg;
  86. {
  87. char mesg[255];
  88. strcpy(mesg,msg);
  89.     ParamText(mesg,"","","");
  90.     Alert(ERRALRT,0);
  91. }
  92.  
  93. /*********************/
  94.  
  95. CheckMulti()
  96.  
  97. #define WNETrapNum  0x60
  98. #define UnImplTrapNum 0x9F
  99. {
  100. int i;
  101.     if (NGetTrapAddress(WNETrapNum, ToolTrap) ==
  102.         NGetTrapAddress(UnImplTrapNum, ToolTrap))
  103.         runningMulti = FALSE;
  104.     else {
  105.         runningMulti = TRUE;
  106.         for (i=0;i<3;i++)
  107.             EventAvail(everyEvent, &theEvent);
  108.     }
  109.     inForeground = TRUE;
  110. }
  111.  
  112. /***************************/
  113.  
  114. Shutdown()
  115. {
  116. int i;
  117.     for (i=0;i<3;i++)
  118.         EventAvail(everyEvent, &theEvent);
  119.     if (theWinOpen)
  120.         DisposeWindow(theWin);
  121. }
  122.  
  123. /***********************************************************************************/
  124. /********************** Mac User Interface stuff below this line *******************/
  125. /***********************************************************************************/
  126.  
  127. /********* Initialization **********/
  128. Die()
  129. {
  130.     ExitToShell();
  131. }
  132.  
  133.  
  134. /***************************/
  135. WindowSetup()
  136. {
  137. Rect r;
  138.     theWinOpen = 1;
  139.     theWin = GetNewWindow(128,NULL,(char *) -1);
  140.     if (!theWin)
  141.       SysBeep(10);
  142.     SetPort(theWin);
  143.     r = theWin->portRect;
  144.     InsetRect(&r,5,5);
  145. //    r.top = r.bottom - 150;
  146.     TTY_InitMessages(theWin,r,monaco,12);
  147. }
  148.  
  149. /***************************/
  150. MenuSetup()
  151. {
  152. int i;
  153.         menuList[Desk_ID] = GetMenu(DeskResID); 
  154.         AddResMenu(menuList[Desk_ID], 'DRVR');
  155.         menuList[File_ID] = GetMenu(FileResID);
  156.         menuList[Edit_ID] = GetMenu(EditResID);
  157.         menuList[Option_ID] = GetMenu(OptionResID);
  158.         for (i=0;i<MENUCOUNT;i++)
  159.             InsertMenu(menuList[i], 0);
  160.         DrawMenuBar();
  161. }
  162.  
  163. /***************************/
  164.  
  165. int CheckOS()
  166. {
  167. OSErr err;
  168. char s[256];
  169.  
  170.     gOSVersion = 0;
  171.     if (err=Gestalt(gestaltSystemVersion,&gOSVersion)) {
  172.         sprintf(s,"Error calling Gestalt %d\r",err);
  173.     }
  174.     else {
  175.         sprintf(s,"O/S=%0lX\r",gOSVersion);
  176.     }
  177.     TTY_WriteMessage(s);
  178.     return err;
  179. }
  180.  
  181. /***************************/
  182.  
  183. Initialize()
  184. {
  185.     MaxApplZone();
  186.     MoreMasters();
  187.     InitGraf(&thePort);
  188.     InitFonts();
  189.     FlushEvents(everyEvent,0);
  190.     InitWindows();
  191.     InitMenus();
  192.     TEInit();
  193.     InitDialogs(Die);
  194.     InitCursor();
  195.     WindowSetup();
  196.     MenuSetup();
  197.     CheckMulti();
  198.  
  199.     if (CheckOS())
  200.         done=1;
  201.     else
  202.         done=0;
  203.         
  204.     if (gOSVersion>=0x700) /*System 7 or better*/
  205.         InitAppleEvents();
  206.     
  207. }
  208.  
  209.  
  210. /****** Event stuff follows *******/
  211.  
  212. MDeskAbout()
  213. {
  214. int i;
  215. Handle h;
  216.  
  217.     i=Alert(128,0);
  218. }
  219.  
  220.  
  221. MFileQuit()
  222. {
  223.     done=1;
  224. }
  225.  
  226. /*** Menu Dispatcher ***/
  227.  
  228. MenuItem(menuID,itemNumber)
  229.   short menuID, itemNumber;
  230. {
  231.   Str255 daName;
  232.   GrafPtr theCurrentPort;
  233.   char *tempstr,temp[35];
  234.   int i;
  235.  
  236.   switch (menuID-1) {
  237.  
  238.     case Desk_ID:
  239.         switch (itemNumber) {
  240.         case 1:
  241.             MDeskAbout();
  242.             break;
  243.         case 2:
  244.             break;
  245.         default:
  246.             EnableItem(menuList[Edit_ID],0);
  247.             GetItem(menuList[Desk_ID],itemNumber,&daName);
  248.             GetPort(&theCurrentPort);
  249.             OpenDeskAcc(&daName);
  250.             SetPort(theCurrentPort);
  251.             break;
  252.         }
  253.         break;
  254.  
  255.     case File_ID:
  256.       switch (itemNumber) {
  257.         case 1: 
  258.              MFileQuit();
  259.             break;
  260.       }
  261.       break;
  262.       
  263.     case Edit_ID:
  264.       SystemEdit(itemNumber-1);
  265.       break;
  266.           
  267.     default: 
  268.       break;
  269.   }/*case*/
  270.   
  271.   HiliteMenu(0);
  272. }/**MenuItem**/
  273.  
  274. /***** Menu key front end *****/
  275. DoMenu(menuResult)
  276.   long menuResult;
  277. {
  278.   short menuID, itemNumber;
  279.   Str255 daName;
  280.   GrafPtr theCurrentPort;
  281.   char *tempstr;
  282.   
  283.   menuID = HiWord(menuResult);
  284.   itemNumber = LoWord(menuResult);
  285.   MenuItem(menuID,itemNumber);
  286.  
  287. }/*DoMenu*/
  288.  
  289.  
  290. /**** Mouse event handler ****/
  291. DoMouseDown()
  292. {
  293.   windowCode = FindWindow(theEvent.where,&whichWindow);
  294.  
  295.   switch (windowCode) {
  296.     case inMenuBar:
  297.       DoMenu(MenuSelect(theEvent.where));
  298.       break;
  299.  
  300.     case inSysWindow:
  301.       SystemClick(&theEvent,whichWindow);
  302.       break;
  303.     
  304.     case inDesk:
  305.       break;
  306.       
  307.     case inContent:
  308.           SelectWindow(whichWindow);
  309.           break;
  310.       
  311.     case inDrag:
  312.         DragWindow(whichWindow, theEvent.where, &(screenBits.bounds));
  313.           break;
  314.       
  315.     case inGrow:
  316.       break;
  317.       
  318.     case inGoAway:
  319.         if (whichWindow==theWin) 
  320.             if (TrackGoAway(whichWindow, theEvent.where))
  321.                 done = TRUE;
  322.           break;
  323.  
  324.     default: 
  325.       break;
  326.    }
  327. }/*DoMouseDone*/
  328.  
  329.  
  330. /***** Key event handler *****/
  331. DoKeyDown()
  332. {
  333.   short menuID, itemNumber;
  334.   long menuResult;
  335.   char globCh;
  336.  
  337.   globCh = theEvent.message & KEYMASK;
  338.   if (theEvent.modifiers & cmdKey) {
  339.     menuResult=MenuKey(globCh);
  340.     menuID = HiWord(menuResult);
  341.     itemNumber = LoWord(menuResult);
  342.     MenuItem(menuID,itemNumber);
  343.     HiliteMenu(0);
  344.   }/*if*/
  345. }
  346.  
  347.  
  348. /**** Update event handler ****/
  349. DoUpdate()
  350. {
  351.   GrafPtr curPort;
  352.   WindowPtr curWin;
  353.   
  354.   curWin = (WindowPtr) theEvent.message;
  355.     
  356.   GetPort(&curPort);
  357.   SetPort(curWin);
  358.   BeginUpdate(curWin);
  359. /**/
  360.     if (curWin==theWin) {
  361.         TTY_RedrawMessages();
  362.     }
  363.   EndUpdate(curWin);
  364.   SetPort(curPort);
  365. }
  366.  
  367.  
  368. /**********************************/
  369. DoMulti(myEvent)
  370. EventRecord *myEvent;
  371. {
  372. #define MouseMovedEvt 0xFA
  373. Byte HiByte;
  374. long bit0;
  375. int sysresult;
  376. long MouseMove;
  377.  
  378.         bit0 = 31;
  379.         MouseMove =  myEvent->message;
  380.         HiByte = (Byte)((char *)(&MouseMove)[0]);
  381.         if (HiByte == MouseMovedEvt) 
  382.             ;
  383.  
  384.         if (myEvent->message & 1) {
  385.                 inForeground = TRUE;
  386.         }
  387.         else {
  388.                 inForeground = FALSE;
  389.         }
  390. }
  391.  
  392. /****** Event LOOP guts ******/
  393.  
  394. int CkEvents()
  395. {
  396. #define MultiFinderEvt 15
  397.  
  398. long sleep;
  399. int doit;
  400. OSErr err;
  401. char s[80];
  402.     
  403.     if (inForeground)
  404.         sleep = 0;
  405.     else
  406.         sleep = 20;
  407.     
  408.     if (runningMulti) {
  409.         doit = WaitNextEvent(everyEvent, &theEvent, sleep, NULL);
  410.     }
  411.     else {
  412.         SystemTask(); /*Let desk accs have some time*/
  413.         doit = GetNextEvent(everyEvent, &theEvent); /*check for pending events*/
  414.     }
  415.  
  416.     if (doit) {
  417.         switch (theEvent.what) {
  418.     
  419.         case kHighLevelEvent:
  420.             err = AEProcessAppleEvent( &theEvent ) ;
  421.             if (err!=noErr) {
  422.                 sprintf(s, "Error handling HighLevelEvent %d\r", err);
  423.                 TTY_WriteMessage(s);
  424.             }
  425.             break;
  426.     
  427.         case mouseDown:
  428.               DoMouseDown();
  429.               break;
  430.         
  431.         case mouseUp:
  432.               break;
  433.           
  434.         case autoKey:
  435.         case keyDown:
  436.               DoKeyDown();
  437.               break;
  438.          
  439.         case keyUp:
  440.               break;
  441.           
  442.         case activateEvt:
  443.               break;
  444.              
  445.         case updateEvt:
  446.               DoUpdate();
  447.               break;
  448.           
  449.         case diskEvt:
  450.           break;
  451.           
  452.         case networkEvt:
  453.           break;
  454.           
  455.         case driverEvt:
  456.           break;
  457.           
  458.         case MultiFinderEvt: 
  459.             DoMulti(&theEvent);
  460.             break;
  461.     
  462.         case nullEvent:
  463.               break;
  464.           
  465.         default:
  466.           break;
  467.             
  468.           }/*switch the...*/
  469.           return (theEvent.what);
  470.     }/*if getnext...*/
  471.     else return (nullEvent);
  472. }
  473.  
  474. /*****************************************/
  475.  
  476. main()
  477. {
  478.     Initialize();
  479.     while (!done)
  480.         CkEvents();
  481.     Shutdown();
  482.     ExitToShell();
  483. }